from info.modules.index import index_bp
from flask import render_template, current_app, session, jsonify, request, g
from info.models import User, News, Category
from info import constants
from info.utils.common import get_user_data
from info.utils.response_code import RET


# get请求地址：/news_list?cid=1&p=1&per_page=10
@index_bp.route('/news_list')
def get_news_list():
    """
    1.获取参数
        1.1 cid:分类id   p:当前页码,1表示第一页  per_page:每一页多少条数据,默认10条
    2.校验参数
        2.1 cid非空判断
        2.2 将数据int强制类型转换
    3.逻辑处理
        3.1 根据cid作为查询条件，新闻的时间降序排序,进行分页查询
        3.2 将新闻数据列表转换为字典列表
    4.返回数据
    :return:
    """
    # 1.1 cid:分类id   p:当前页码,1表示第一页  per_page:每一页多少条数据,默认10条
    args_dict = request.args
    page = args_dict.get("p", '1')
    per_page = args_dict.get("per_page", constants.HOME_PAGE_MAX_NEWS)
    cid = args_dict.get("cid", '1')

    #  2.1 cid非空判断
    if not cid:
        return jsonify(errno=RET.PARAMERR, errmsg="参数不全")
    # 2.2 将数据int强制类型转换
    try:
        page = int(page)
        per_page = int(per_page)
        cid = int(cid)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")



    """
        news_list = []
        current_page = 1
        total_page = 1
        # 查询的是最新的分类新闻数据，最新新闻查询只需要根据时间降序排序即可
        if cid == 1:
            paginate = News.query.filter().order_by(News.create_time.desc()).paginate(p, per_page, False)
            # 获取当前所有数据
            news_list = paginate.items
            # 获取当前页码
            current_page = paginate.page
            # 获取总页数
            total_page = paginate.pages
        # 查询其他分类新闻需要加上这个条件：News.category_id == cid
        else:
            paginate = News.query.filter(News.category_id == cid).order_by(News.create_time.desc()).paginate(p, per_page, False)
                                                                                                             
            # 获取当前所有数据
            news_list = paginate.items
            # 获取当前页码
            current_page = paginate.page
            # 获取总页数
            total_page = paginate.pages
        """
    # 3.1 根据cid作为查询条件，新闻的时间降序排序,进行分页查询
    filters = [News.status == 0]

    # 若分类id不为1，那么添加分类id的过滤
    if cid != 1:
        # 将查询条件添加到列表中
        filters.append(News.category_id == cid)

        # paginate():参数1：当前页码， 参数2：每一页多少条数据 参数3：不需要错误数据，使用try捕获
        # 将查询列表中条件进行解包：*filters
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page, False)

        # 获取当前所有数据
        items = paginate.items
        # 获取总的页数
        total_page = paginate.pages
        # 获取当前页码
        current_page = paginate.page
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询失败")
    # 3.2 将新闻数据列表转换为字典列表

    news_list = []
    for news in items:
        news_list.append(news.to_basic_dict())

    # 4.返回数据
    data = {

        "totalPage": total_page,
        "currentPage": current_page,
        "newsList": news_list,


    }
    return jsonify(errno=RET.OK, errmsg="查询数据成功", data=data)


# 2.使用蓝图对象装饰视图函数
@index_bp.route('/')
@get_user_data
def index():
    # --------1.用户登录成功,查询用户基本信息展示--------

    # 使用g对象传递user对象数据
    user = g.user

    #  将用户对象转化成字典
    user_dict = user.to_dict() if user else None

    # ------2.查询新闻点击排行数据展示------------
    news_list = None
    try:
        news_list = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据异常")

    # 将新闻对象列表转化为字典列表
    click_news_list = []
    for news in news_list if news_list else []:
        click_news_list.append(news.to_dict())

    # ------3.新闻分类展示------------

    # 获取新闻分类数据

    try:
        categories = Category.query.all()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询分类数据异常")

    # 新闻分类数据列表转化为字典列表
    categories_dicts = []

    for category in categories if categories else []:

        categories_dicts.append(category.to_dict())



    # 组织响应数据
    """
        数据格式：
        data = {
            "user_info": {
                    "id": self.id,
                    "nick_name": self.nick_name,
                }
        }

        前端使用方式： data.user_info.nick_name
        """
    data = {
        "user_info": user_dict,
        "click_news_list": click_news_list,
        "categories":categories_dicts

    }

    return render_template("news/index.html", data=data)


@index_bp.route('/favicon.ico')
def get_favicon():

    return current_app.send_static_file('news/favicon.ico')

"""
   Function used internally to send static files from the static
        folder to the browser.
        静态文件发送到浏览器的方法
"""
